/*******************************************************************************
 * Package: com.song.boot.springstudy.redis.clean
 * Type:    LinkedHashMapLru
 * Date:    2025/6/19 11:21
 *
 * Copyright (c) 2025 LTD All Rights Reserved.
 *
 * You may not use this file except in compliance with the License.
 *******************************************************************************/
package com.song.boot.springstudy.redis.clean;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 功能描述： lru 最近最少访问的
 *顺序：插入顺序 fifo，访问顺序 lru。
 * @author Songxianyang
 * @date 2025/6/19 11:21
 */
public class LinkedHashMapFifo {
    public static void main(String[] args) {
        // accessOrder设置为false时，按照插入顺序，设置为true时，按照访问顺序
        LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>(5, 0.75f, false) {
            /**
             * 该方法用于判断是否需要移除最久远的条目，常用于实现缓存机制。默认返回 false，表示不自动移除任何条目。
             * 简要逻辑如下：
             * 每次调用 put 或 putAll 时会触发此方法。
             * 若返回 true，则移除当前最老的条目（即最近最少使用的条目）。
             * 默认始终返回 false，表示不删除任何条目。
             * @return boolean
             */
            protected boolean removeEldestEntry(Map.Entry eldest) {
                // 若返回 true，则移除当前最老的条目（即最近最少使用的条目）
                //当LinkHashMap的容量大于等于5的时候,再插入就移除旧的元素
                return this.size() >= 5;
            }
        };

        map.put(1, "b");
        map.put(2, "d");
        map.put(3, "f");
        map.put(4, "h");
        System.out.println(map);
        map.get(3);
        System.out.println("----------3-----------");
        System.out.println(map);
        map.get(1);
        System.out.println("----------1-----------");
        System.out.println(map);
        // todo 阈值>=5
        System.out.println("----------put-----------");
        map.put(5, "f");
        System.out.println(map);
    }
}
